let targetMap = new WeakMap()
let activeEffect = null
// 依赖收集
export function track (target, key) {
  let depsMap = targetMap.get(target)
  if(!depsMap) {
    // 初始化target-weakMap
    targetMap.set(target, depsMap = new Map())
  }
  let deps = depsMap.get(key)
  if(!deps) {
    // 初始化属性依赖
    deps = new Set()
  }
  // 添加依赖
  if(activeEffect && !deps.has(activeEffect)) {
    deps.add(activeEffect)
  }
  depsMap.set(key, deps)
}

// 触发依赖更新
export function trigger (target, key) {
  // 找到依赖
  const depsMap = targetMap.get(target)
  if(!depsMap) {
    // 依赖不存在
    return
  }
  let deps = depsMap.get(key)
  if(!deps) {
    // 依赖不存在
    return
  }
  // 遍历依赖中的方法并调用
  deps.forEach(effectFn => effectFn())
}


// 观察者-事件触发
export function effect (fn, options = {}) {
  const effectFn = () => {
    try {
      // 从全局中拿到变量activeEffect
      activeEffect = effectFn
      // fn 执行的时候，内部读取响应式数据的时候，就能在get配置里读取到activeEffect,将其放到依赖集合中去
      return fn()
    } finally {
      activeEffect = null
    }
  }
  if(!options.lazy) {
    // 日过没有配置lazy 则调用
    effectFn()
  }
  // 需要一个字段判断是否要立即调用，默认立即调用
  return effectFn
}
